package dp.二维数组;


import java.util.Arrays;

/**
 * https://leetcode.cn/problems/delete-operation-for-two-strings/
 *
 * 题解：https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247493829&idx=1&sn=da3fdfce6c6574cda64b5d9d544a535b&chksm=9bd416cdaca39fdbad0cd2445cc59791a10ea05d215d7cd5dcae008991da0e9a1257eea682d5&scene=178&cur_album_id=2165181514903355392#rd
 *
 * 这题和最长子序列差不多的（1143）
 *
 * 怎么让两个字符串相同，直接全删成空串，肯定可以，但是求删除次数最少，肯定就是删除最长公共子序列了，所以先求出两个字符串的最长子序列，然后。。
 */
public class _583_两个字符串的删除操作 {

    public int minDistance(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();
        int result = longestCommonSubsequence(word1,word2);
        return m - result + n - result;
    }


    public int longestCommonSubsequence(String text1, String text2) {

        int m = text1.length();
        int n = text2.length();
        // 备忘录值为 -1 代表未曾计算
        meno = new int[m][n];
        for (int[] row : meno) {
            Arrays.fill(row, -1);
        }
        // 计算 s1[0..] 和 s2[0..] 的 lcs 长度
        return dp(text1, 0, text2, 0);
    }

    int[][] meno;

    // 定义：计算 s1[i..] 和 s2[j..] 的最长公共子序列长度
    private int dp(String s1, int i, String s2, int j) {
        // base case
        if (i == s1.length() || j == s2.length() ) return 0;

        if (meno[i][j] != -1) {
            return meno[i][j];
        }
        // 根据 s1[i] 和 s2[j] 的情况做选择
        if (s1.charAt(i) == s2.charAt(j)) {
            meno[i][j] = 1 + dp(s1, i + 1, s2, j + 1);
        } else {
            // s1[i] 和 s2[j] 至少有一个不在 lcs 中
            meno[i][j] = Math.max(dp(s1, i + 1, s2, j), dp(s1, i, s2, j + 1));
        }

        return meno[i][j];
    }

}
